/// <reference path="./types/koa-body.d.ts" />

import Koa from 'koa'
import cors from 'koa2-cors'
import koaBody, { HttpMethodEnum } from 'koa-body'
import koaStatic from 'koa-static'
import { errorHandler } from './middleware/errorHandler'
import { loadRoutes } from './routes' // 导入自动路由加载函数
import path from 'path'
import fs from 'fs'
import connectDB from './config/database' // 引入数据库连接函数
import { verifyToken } from './utils/jwtToken' // 引入JWT验证中间件
import { uuid } from './utils/utils'

const app = new Koa()

// 连接数据库
connectDB()
  .then(() => {
    console.log('数据库初始化完成')
  })
  .catch((err) => {
    console.error('数据库初始化失败:', err)
  })

// 创建 uploads 目录
const uploadDir = path.join(__dirname, 'static/uploads')
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir, { recursive: true })
}

// 中间件
app
  // 全局错误处理中间件（放在所有中间件之前）
  .use(errorHandler)
  .use(cors())
  .use(
    koaStatic(path.join(__dirname, 'static'), {
      // 配置静态文件服务选项
      hidden: true, // 不允许访问隐藏文件
      gzip: true // 启用 gzip 压缩
    })
  )
  .use(
    koaBody({
      // 使用 koa-body 中间件
      multipart: true, // 支持文件上传
      json: true, // 支持 JSON 格式
      parsedMethods: [
        // 只解析这些方法的body
        HttpMethodEnum.POST,
        HttpMethodEnum.PUT,
        HttpMethodEnum.PATCH,
        HttpMethodEnum.DELETE
      ] as HttpMethodEnum[],
      formidable: {
        multiples: true, // 支持多文件上传
        // 配置文件上传
        uploadDir: path.join(__dirname, 'static/uploads'), // 临时存储路径
        keepExtensions: true, // 保留文件扩展名
        onFileBegin: (name, file) => {
          if (file.originalFilename) {
            // 使用 uuid 生成唯一文件名，保留原始扩展名
            const ext = path.extname(file.originalFilename)
            const uniqueName = `${uuid()}${ext}`
            file.filepath = path.join(__dirname, 'static/uploads', uniqueName)
          }
        }
      }
    })
  )
  // JWT token 验证中间件
  .use(verifyToken)

// 自动加载路由
loadRoutes(app)

export default app
